package com.sy.olddriver.service.impl;

import com.sy.olddriver.constant.AppConstant;
import com.sy.olddriver.dao.ProductDao;
import com.sy.olddriver.dao.impl.ProductDaoImpl;
import com.sy.olddriver.dto.Result;
import com.sy.olddriver.entity.Product;
import com.sy.olddriver.entity.User;
import com.sy.olddriver.exception.OldDriverException;
import com.sy.olddriver.service.HistoryService;
import com.sy.olddriver.utils.HttpUtils;
import com.sy.olddriver.utils.RandomUtils;
import com.sy.olddriver.utils.RedisUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * HistoryService接口对应的实现类
 *
 * @author Administrator
 */
public class HistoryServiceImpl implements HistoryService {
    private ProductDao productDao = new ProductDaoImpl();

    @Override
    public void addHistory(String pid) {
        //获取当前的登录用户
        User loginUser = HttpUtils.getLoginUser();
        //1.离线状态下
        if (null == loginUser) {
            //获取Cookie中有无用来表示临时浏览记录的Cookie
            String tempHistory = HttpUtils.getCookie(AppConstant.TEMP_HISTORY_COOKIE_NAME);
            //(1)如果没有，则创建该Cookie，并在Redis中添加第一条访问记录
            if (StringUtils.isBlank(tempHistory)) {
                String tempHistoryId = RandomUtils.getRandomStr();
                HttpUtils.setCookie(AppConstant.TEMP_HISTORY_COOKIE_NAME, tempHistoryId, null);
                RedisUtils.lpush(AppConstant.TEMP_HISTORY_REDIS_PREFIX + tempHistoryId, pid);
            }
            //(2)如果有，则根据该Cookie，在Redis中找到当前客户端访问的记录列表，并添加这次的访问记录
            else {
                String key = AppConstant.TEMP_HISTORY_REDIS_PREFIX + tempHistory;
                //在添加之前先删除该pid在list中的已有记录
                RedisUtils.lrem(key, AppConstant.LIST_DELTE_ALL_COUNT, pid);
                RedisUtils.lpush(key, pid);
            }
        }
        //2.在线状态下
        else {
            Integer userId = loginUser.getId();
            String key = AppConstant.USER_HISTORY_REDIS_PREFIX + userId;
            RedisUtils.lrem(key, AppConstant.LIST_DELTE_ALL_COUNT, pid);
            RedisUtils.lpush(key, pid);
        }
    }

    @Override
    public void mergeHistory(Integer userId) {
        //1.获取临时状态下的历史记录
        List<String> tempHistoryList = new ArrayList<>();
        //（1）获取临时记录在Cookie中的值
        String tempHistoryCookieId = HttpUtils.getCookie(AppConstant.TEMP_HISTORY_COOKIE_NAME);
        //a.如果Cookie中没有这个值
        //b.如果Cookie中有这个值
        if (StringUtils.isNotBlank(tempHistoryCookieId)) {
            String key = AppConstant.TEMP_HISTORY_REDIS_PREFIX + tempHistoryCookieId;
            tempHistoryList = RedisUtils.lrange(key, AppConstant.REDIS_LIST_START_INDEX_DEFAUL_VALUE, RedisUtils.llen(key) - 1);
            //3.将临时状态下的历史记录删除
            RedisUtils.del(key);
        }

        //2.获取当前登录的用户的历史记录
        String userHistoryRedisKey = AppConstant.USER_HISTORY_REDIS_PREFIX + userId;
        List<String> userHistoryList = RedisUtils.lrange(userHistoryRedisKey, AppConstant.REDIS_LIST_START_INDEX_DEFAUL_VALUE, RedisUtils.llen(userHistoryRedisKey) - 1);
        //4.将临时状态下的历史记录和登录状态下的历史记录进行合并（合并过程中注意去重）
        //如果临时状态下的历史记录为空，就不用合并历史记录了,如果不为空，进行合并
        if (CollectionUtils.isNotEmpty(tempHistoryList)) {
            for (String tempHistory : tempHistoryList) {
                //删除重复的元素
                RedisUtils.lrem(userHistoryRedisKey, AppConstant.LIST_DELTE_ALL_COUNT, tempHistory);
                RedisUtils.lpush(userHistoryRedisKey, tempHistory);
            }
        }


    }

    @Override
    public Result getHistoryList() {
        Result result = new Result();
        try {

            //先判断当前用户是否已经登录
            User user = HttpUtils.getLoginUser();
            String key;
            //1.如果已经登录，则在Redis中获取user_history作为key的前缀的历史记录
            if (null != user) {
                key = AppConstant.USER_HISTORY_REDIS_PREFIX + user.getId();
                System.out.print("登录状态:");
            }
            //2.如果未登录，则在Redis中获取temp_hisyory最为key的前缀的历史记录
            else {
                key = AppConstant.TEMP_HISTORY_REDIS_PREFIX + HttpUtils.getCookie(AppConstant.TEMP_HISTORY_COOKIE_NAME);
                System.out.print("未登录状态");
            }
            List<String> pids = RedisUtils.lrange(key, AppConstant.REDIS_LIST_START_INDEX_DEFAUL_VALUE, RedisUtils.llen(key) - 1);
            System.out.println("pids:" + pids);
            //3.在Dao层根据获取到的历史记录对应的id列表，然后以这些列表中的值作为查询依据
            //查询对应的产品信息
            List<Product> historyProducts;
            if (CollectionUtils.isEmpty(pids)) {
                historyProducts = new ArrayList<>();
            } else {
                historyProducts = productDao.getProductsByIds(pids);
            }
            result.setData(historyProducts);
        } catch (OldDriverException e) {
            e.printStackTrace();
            result.setSuccess(false);
            result.setErrMsg(e.getMessage());
        }
        return result;
    }


}
